home *** CD-ROM | disk | FTP | other *** search
- /*
- * memset.c
- */
-
- #include <string.h>
- #include <stdint.h>
-
- void *memset(void *dst, int c, size_t n)
- {
- char *q = dst;
-
- #if defined(__i386__)
- size_t nl = n >> 2;
- asm volatile("cld ; rep ; stosl ; movl %3,%0 ; rep ; stosb"
- : "+c" (nl), "+D" (q)
- : "a" ((unsigned char)c * 0x01010101U), "r" (n & 3));
- #elif defined(__x86_64__)
- size_t nq = n >> 3;
- asm volatile("cld ; rep ; stosq ; movl %3,%%ecx ; rep ; stosb"
- : "+c" (nq), "+D" (q)
- : "a" ((unsigned char)c * 0x0101010101010101U),
- "r" ((uint32_t)n & 7));
- #else
- while ( n-- ) {
- *q++ = c;
- }
- #endif
-
- return dst;
- }
-